import config from '@/app.config.js'
const tokenKey = config.lzy.storageKey + '-token';
const domain = config.lzy.domain;

const utils = {
	//接口地址
	interfaceUrl: function() {
		return domain
	},
	delayed: null,
	toast: function(text, duration, success) {
		uni.showToast({
			title: text || "出错啦~",
			icon: success || 'none',
			duration: duration || 2000
		})
	},
	modal: function(title, content, showCancel = false, callback, confirmColor, confirmText, cancelColor,
		cancelText) {
		uni.showModal({
			title: title || '提示',
			content: content,
			showCancel: showCancel,
			cancelColor: cancelColor || "#555",
			confirmColor: confirmColor || "#e41f19",
			confirmText: confirmText || "确定",
			cancelText: cancelText || "取消",
			success(res) {
				if (res.confirm) {
					callback && callback(true)
				} else {
					callback && callback(false)
				}
			}
		})
	},
	/**
	 * 请求数据处理
	 * @param string url 请求地址 。支持输入完整的请求地址，以http或https开头。modify by LZy on 2023.8.13
	 * @param {*} postData 请求参数
	 * @param string method 请求方式
	 *  GET or POST
	 * @param string contentType 数据格式
	 *  'application/x-www-form-urlencoded'
	 *  'application/json'
	 * @param bool isDelay 是否延迟显示loading
	 * @param bool hideLoading 是否隐藏loading
	 *  true: 隐藏
	 *  false:显示
	 * @param string loadingTitle loading显示的文字
	 * @param function callback 回调函数。登录过期的场景，重新登录后要重新调用的页面取数据函数，如getData，getList等
	 */
	request: function(url, postData = {}, method = "GET", contentType = "application/x-www-form-urlencoded",
		isDelay, hideLoading,
		loadingTitle, callback) {
		//接口请求
		let loadding = false;
		utils.delayed && uni.hideLoading();
		clearTimeout(utils.delayed);
		utils.delayed = null;
		if (!hideLoading) {
			utils.delayed = setTimeout(() => {
				uni.showLoading({
					mask: true,
					title: loadingTitle || '请稍候...',
					success(res) {
						loadding = true
					}
				})
			}, isDelay ? 1000 : 0)
		}
		// if(!contentType) contentType = "application/x-www-form-urlencoded";
		contentType = "application/json";

		// console.log('封装request-token', utils.getToken())	
		return new Promise((resolve, reject) => {
			uni.request({
				url: url.indexOf("http") == 0 ? url : (utils.interfaceUrl() + url),
				data: postData,
				header: {
					'content-type': contentType,
				},
				method: method, //'GET','POST'
				dataType: 'json',
				timeout: 15000, // 15秒超时
				withCredentials: true,
				success: (res) => {
					// console.log('====request返回值', res)
					if (res.statusCode === 200) {
						// message: "获取接口信息失败", code: 0, id: 0
						
						// 新增、修改返回 {code, message}
						// if (res.data.code === 1) resolve(res.data);
						if (res.data.code != undefined) resolve(res.data);
						// 列表、详情返回 []
						else if (!res.data.code && !!res.data) resolve({code: 1, rows: res.data});
						else {
							console.error('====request返回200但错误', res)
							reject(res.data.message || '未知错误');
						}
					} else {
						console.error('====request返回错误', res)
						reject(res.message || res.statusCode);
					}
				},
				fail: (res) => {
					console.error('====request失败', res)
					utils.toast("网络不给力，请稍后再试~")
					reject(res)
				},
				complete: function(res) {
					if (!hideLoading) {
						uni.hideLoading()
					}
					clearTimeout(utils.delayed)
					utils.delayed = null;
					if (res.statusCode === 200) {
						if (res.data.code === 1) ;
						else if (!res.data.code && !!res.data) ;
						else {
							uni.navigateTo({
								url: '/pages/error/404/404',
								success: (res1) => {
									// 通过eventChannel向被打开页面传送数据
									res1.eventChannel.emit('error', res)
								}
							})
						}
					}
					else if(res.statusCode === 500){
						uni.navigateTo({
							url: '/pages/error/500/500',
							success: (res1) => {
								// 通过eventChannel向被打开页面传送数据
								res1.eventChannel.emit('error', res)
							}
						})
					}
					else {
						utils.toast('服务器开小差了~' + res.statusCode);
					}
				}
			})
		})
	},
	/**
	 * 使用Promise.all处理多个请求
	 * @param {Object} urlArr 请求地址：如果是同一个地址，则字符串即可。如果是不同地址，则需与dataArr一一对应
	 * @param {Object} dataArr 参数：数组
	 * @param {Object} cb1 成功回调（暂不用，改为return）
	 * @param {Object} cb2 失败回调（暂不用，改为return）
	 * @return {type} 返回Promise.all，调用处可接续.then().catch()来进行后续处理。
	 */
	requestAll(urlArr, dataArr, cb1, cb2){
		let url;
		
		let requestArr = [];
		
		dataArr.forEach((data, i) => {
			url = urlArr instanceof Array ? urlArr[i] : urlArr
			requestArr.push(new Promise((resolve, reject) => {
				if (config.debug) console.log('参数', i, url, data)
				
				utils.request(url, data, 'GET', null, false, true)
					.then(res => {
						if (config.debug) console.log('res', res)
						if (res.code == 1) {
							resolve(res.code);
						} else {
							reject(res.message);
						}
					})
					.catch(err => reject(err))
			}))
		})		
		return Promise.all(requestArr) //执行所有需请求的接口
		
		// Promise.all(requestArr) //执行所有需请求的接口
		// 	.then((res) => {
		// 		console.log('Promise.all-res', res)
		// 		cb1 && cb1()
		// 		resolve(1);
		// 	})
		// 	.catch(err => {
		// 		console.log('Promise.all-err', err)
		// 		cb2 && cb2()
		// 		reject(res.message);
		// 	});
	},
	/**
	 * 上传文件
	 * @param string url 请求地址
	 * @param string src 文件路径
	 */
	uploadFile: function(url, src, header, formData, file) {
		uni.showLoading({
			title: '正在上传...'
		})
		return new Promise((resolve, reject) => {
			const uploadTask = uni.uploadFile({
				url: url.indexOf("http") == 0 ? url : (utils.interfaceUrl() + url),
				filePath: src,
				// name: 'file',
				name: 'image',
				// files:[{
				// 	name: 'image',
				// 	file,
				// 	uri: src
				// }],
				header: {
					'content-type': 'multipart/form-data'
				},
				formData,
				success: function(res) {
					console.log('上传文件success', res)
					uni.hideLoading()
					let data = JSON.parse(res.data.replace(/\ufeff/g, "") || "{}")
					
					// console.log('上传文件successdata', data)
					
					if (data.code == 1) {
						//返回图片地址
						resolve(data.imgurl)
					} else {
						utils.toast(data.message);
					}
				},
				fail: function(res) {
					console.log('上传文件fail', res)
					utils.toast("网络不给力，请稍后再试~")
					reject(res)
				}
			})
		})
	},
	//设置token
	setToken: function(token) {
		uni.setStorageSync(tokenKey, token)
	},
	//获取token
	getToken: function() {
		// return uni.getStorageSync(tokenKey)
		return vk.getVuex('$user.token');
	},
}

module.exports = {
	interfaceUrl: utils.interfaceUrl,
	request: utils.request,
	requestAll: utils.requestAll,
	uploadFile: utils.uploadFile,
	setToken: utils.setToken,
	getToken: utils.getToken,
	toLogin: utils.toLogin,
}